home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Taifun
/
Taifun 175 (1991-09-10)(Manewaldt, A.)(DE)(PD).zip
/
Taifun 175 (1991-09-10)(Manewaldt, A.)(DE)(PD).adf
/
Term
/
Source.LZH
/
termSub.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-06
|
9KB
|
454 lines
/* $Revision Header * Header built automatically - do not edit! *************
*
* (C) Copyright 1990 by Olaf 'Olsen' Barthel & MXM
*
* Name .....: TermSub.c
* Created ..: Monday 21-Jan-91 20:12
* Revision .: 0
*
* Date Author Comment
* ========= ======== ====================
* 21-Jan-91 Olsen Created this file!
*
* $Revision Header ********************************************************/
#include "TermGlobal.h"
/* This module deals with the so-called `sub window', which is
* brought up whenever a list of phone entries is to be dialed.
*/
STATIC struct Menu *SubMenu;
STATIC struct Gadget *SubGadgetList;
STATIC struct Gadget *SubGadgetArray[4];
STATIC WORD PositionX = -1,PositionY = -1;
#define SUB_DIAL 1
#define SUB_QUIT 2
#define SUBWIDTH 354
#define SUBHEIGHT 124
enum { MEN_NEXT=1,MEN_PREV,MEN_WINDOW,MEN_DIALENTRY,MEN_DELETECALL,
MEN_CANCEL,MEN_QUITPANEL };
STATIC struct NewMenu CallMenu[] =
{
{ NM_TITLE, "Project", 0 , 0, 0, (APTR)0},
{ NM_ITEM, "Next Entry", "N", 0, 0, (APTR)MEN_NEXT},
{ NM_ITEM, "Previous Entry", "P", 0, 0, (APTR)MEN_PREV},
{ NM_ITEM, "Other Window", "W", 0, 0, (APTR)MEN_WINDOW},
{ NM_ITEM, NM_BARLABEL, 0 , 0, 0, (APTR)0},
{ NM_ITEM, "Dial", "D", 0, 0, (APTR)MEN_DIALENTRY},
{ NM_ITEM, "Delete Call", "E", 0, 0, (APTR)MEN_DELETECALL},
{ NM_ITEM, "Cancel", "C", 0, 0, (APTR)MEN_CANCEL},
{ NM_ITEM, NM_BARLABEL, 0 , 0, 0, (APTR)0},
{ NM_ITEM, "Quit", "Q", 0, 0, (APTR)MEN_QUITPANEL},
{ NM_END, 0, 0 , 0, 0, (APTR)0}
};
STATIC struct Gadget *
SubCreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge)
{
struct Gadget *Gadget;
struct NewGadget NewGadget;
UWORD Offset,Counter = 0;
if(Gadget = CreateContext(GadgetList))
{
NewGadget . ng_Width = 334;
NewGadget . ng_Height = 100;
NewGadget . ng_GadgetText = NULL;
NewGadget . ng_TextAttr = &DefaultFont;
NewGadget . ng_VisualInfo = VisualInfo;
NewGadget . ng_GadgetID = Counter;
NewGadget . ng_LeftEdge = 10;
NewGadget . ng_TopEdge = 1 + TopEdge;
GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
GTLV_Labels, &EmptyList,
GTLV_ShowSelected, NULL,
TAG_DONE);
Offset = SUBWIDTH / 3 + 3;
NewGadget . ng_Width = 92;
NewGadget . ng_Height = 12;
NewGadget . ng_GadgetText = "_Dial";
NewGadget . ng_GadgetID = Counter;
NewGadget . ng_Flags = 0;
NewGadget . ng_LeftEdge = 10;
NewGadget . ng_TopEdge = SUBHEIGHT - 3 - NewGadget . ng_Height;
GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
GT_Underscore, '_',
TAG_DONE);
NewGadget . ng_GadgetText = "D_elete Call";
NewGadget . ng_GadgetID = Counter;
NewGadget . ng_LeftEdge = NewGadget . ng_LeftEdge + Offset;
GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
GT_Underscore, '_',
TAG_DONE);
NewGadget . ng_GadgetText = "_Cancel";
NewGadget . ng_GadgetID = Counter;
NewGadget . ng_LeftEdge = NewGadget . ng_LeftEdge + Offset;
GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
GT_Underscore, '_',
TAG_DONE);
}
return(Gadget);
}
BYTE
OpenSubWindow()
{
if(SubCreateAllGadgets(&SubGadgetArray[0],&SubGadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
{
if(SubMenu = CreateMenus(CallMenu,
GTMN_FrontPen, 0,
TAG_DONE))
{
if(LayoutMenus(SubMenu,VisualInfo,
GTMN_TextAttr,&DefaultFont,
TAG_DONE))
{
if(PositionX == -1)
PositionX = (Screen -> Width - SUBWIDTH) >> 1;
if(PositionY == -1)
PositionY = Window -> Height - SUBHEIGHT;
if(SubWindow = OpenWindowTags(NULL,
WA_Width, SUBWIDTH,
WA_Height, SUBHEIGHT,
WA_Left, PositionX,
WA_Top, PositionY,
WA_DragBar, TRUE,
WA_DepthGadget, TRUE,
WA_CloseGadget, TRUE,
WA_RMBTrap, TRUE,
WA_CustomScreen,Screen,
WA_IDCMP, IDCMP_CLOSEWINDOW | BUTTONIDCMP | LISTVIEWIDCMP | IDCMP_MENUPICK,
WA_Title, "Dial List",
TAG_DONE))
{
AddGList(SubWindow,SubGadgetList,(UWORD)-1,(UWORD)-1,NULL);
RefreshGList(SubGadgetList,SubWindow,NULL,(UWORD)-1);
GT_RefreshWindow(SubWindow,NULL);
if(SubList)
{
SubItemNum = SubListNum - 1;
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Labels,SubList,
GTLV_Selected,SubListNum,
TAG_DONE);
}
SetMenuStrip(SubWindow,SubMenu);
SubWindow -> Flags &= ~WFLG_RMBTRAP;
return(TRUE);
}
}
FreeMenus(SubMenu);
SubMenu = NULL;
}
FreeGadgets(SubGadgetList);
SubGadgetList = NULL;
}
return(FALSE);
}
VOID
CloseSubWindow()
{
if(SubWindow)
{
SubWindow -> Flags |= WFLG_RMBTRAP;
ClearMenuStrip(SubWindow);
if(SubGadgetList)
RemoveGList(SubWindow,SubGadgetList,(UWORD)-1);
PositionX = SubWindow -> LeftEdge;
PositionY = SubWindow -> TopEdge;
CloseWindow(SubWindow);
SubWindow = NULL;
}
if(SubMenu)
{
FreeMenus(SubMenu);
SubMenu = NULL;
}
if(SubGadgetList)
{
FreeGadgets(SubGadgetList);
SubGadgetList = NULL;
}
}
VOID
AddSubEntry(LONG Entry)
{
if(!SubList)
{
if(SubList = (struct List *)AllocMem(sizeof(struct List),MEMF_PUBLIC | MEMF_CLEAR))
NewList(SubList);
}
if(SubList)
{
struct PhoneNode *SubNode;
if(SubNode = (struct PhoneNode *)AllocMem(sizeof(struct PhoneNode),MEMF_PUBLIC|MEMF_CLEAR))
{
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Labels,~0,
TAG_DONE);
SubNode -> VanillaNode . ln_Name = Phonebook[Entry] -> Name;
SubNode -> Entry = Phonebook[Entry];
SubNode -> Number = Entry;
AddTail(SubList,&SubNode -> VanillaNode);
SubItemNum = SubListNum;
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Labels, SubList,
GTLV_Selected, SubListNum++,
TAG_DONE);
}
}
}
BYTE
RemSubEntry()
{
struct PhoneNode *SubNode;
LONG i;
SubNode = (struct PhoneNode *)SubList -> lh_Head;
i = 0;
while(i < SubItemNum)
{
SubNode = (struct PhoneNode *)SubNode -> VanillaNode . ln_Succ;
i++;
}
if(SubListNum)
{
if(SubItemNum == (--SubListNum))
{
if(SubItemNum)
SubItemNum--;
}
}
else
SubItemNum = 0;
if(SubWindow)
{
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Labels,~0,
TAG_DONE);
}
Remove(SubNode);
FreeMem(SubNode,sizeof(struct PhoneNode));
if(!SubListNum)
{
if(SubList)
FreeMem(SubList,sizeof(struct List));
SubList = NULL;
CloseSubWindow();
return(TRUE);
}
else
{
if(SubWindow)
{
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Labels,SubList,
GTLV_Selected,SubItemNum,
TAG_DONE);
}
return(FALSE);
}
}
VOID
FreeSubList()
{
if(SubList)
{
struct PhoneNode *NextNode,*SubNode;
LONG i;
if(SubList -> lh_Head)
NextNode = (struct PhoneNode *)SubList -> lh_Head -> ln_Succ;
else
NextNode = NULL;
SubNode = (struct PhoneNode *)SubList -> lh_Head;
for(i = 0 ; i < SubListNum ; i++)
{
NextNode = (struct PhoneNode *)SubNode -> VanillaNode . ln_Succ;
FreeMem(SubNode,sizeof(struct PhoneNode));
SubNode = NextNode;
}
SubListNum = 0;
FreeMem(SubList,sizeof(struct List));
SubList = NULL;
}
}
BYTE
HandleSubWindow(struct Window *PanelWindow)
{
if(SubWindow)
{
struct IntuiMessage *Massage;
ULONG Class,Code;
struct Gadget *Gadget;
while(Massage = (struct IntuiMessage *)GT_GetIMsg(SubWindow -> UserPort))
{
Class = Massage -> Class;
Code = Massage -> Code;
Gadget = (struct Gadget *)Massage -> IAddress;
GT_ReplyIMsg(Massage);
if(Class == IDCMP_MENUPICK)
{
struct MenuItem *MenuItem;
while(Code != MENUNULL)
{
MenuItem = ItemAddress(SubMenu,Code);
switch((ULONG)MENU_USERDATA(MenuItem))
{
case MEN_QUITPANEL: return(SUB_QUIT);
case MEN_CANCEL: CloseSubWindow();
FreeSubList();
return(0);
case MEN_NEXT: if(SubItemNum == SubListNum - 1)
SubItemNum = 0;
else
SubItemNum++;
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Selected,SubItemNum,
TAG_DONE);
break;
case MEN_PREV: if(SubItemNum == 0)
SubItemNum = SubListNum - 1;
else
SubItemNum--;
GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
GTLV_Selected,SubItemNum,
TAG_DONE);
break;
case MEN_WINDOW: if(PanelWindow)
{
WindowToFront(PanelWindow);
ActivateWindow(PanelWindow);
}
break;
case MEN_DIALENTRY: return(SUB_DIAL);
break;
case MEN_DELETECALL: if(RemSubEntry())
return(0);
break;
default: break;
}
Code = MenuItem -> NextSelect;
}
}
if(Class == IDCMP_CLOSEWINDOW)
return(SUB_QUIT);
if(Class == IDCMP_GADGETUP)
{
switch(Gadget -> GadgetID)
{
case 0: SubItemNum = Code;
break;
case 1: return(SUB_DIAL);
break;
case 2: if(RemSubEntry())
return(0);
break;
case 3: CloseSubWindow();
FreeSubList();
return(0);
}
}
}
}
return(0);
}